home *** CD-ROM | disk | FTP | other *** search
/ Belgian Amiga Club - ADF Collection / BS1 part 26.zip / BS1 part 26 / Aztec C v5.2a disk 2.adf / start52.lzh / _main.c < prev    next >
C/C++ Source or Header  |  1991-10-19  |  5KB  |  202 lines

  1. /* Copyright (C) 1986-1990 by Manx Software Systems, Inc. */
  2.  
  3. /*
  4.  *    This is common startup code for both the CLI and the WorkBench.
  5.  *    When called from the WorkBench, argc is 0 and argv points to a
  6.  *    WBStartup type of structure.
  7.  */
  8.  
  9. #include <fcntl.h>
  10. #include <exec/alerts.h>
  11. #include <exec/memory.h>
  12. #include <libraries/dosextens.h>
  13. #include <workbench/startup.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <functions.h>
  17.  
  18. extern long _savsp, _stkbase;
  19.  
  20. extern int errno;
  21. extern int Enable_Abort;
  22.  
  23. extern int _argc, _arg_len;
  24. extern char **_argv, *_arg_lin;
  25. extern struct WBStartup *WBenchMsg;
  26.  
  27. extern struct _dev *_devtab;
  28. extern short _numdev;
  29.  
  30. void _cli_parse(struct Process *pp, long alen, char *aptr);
  31. void _wb_parse(struct Process *pp, struct WBStartup *WBenchMsg);
  32. int main(int argc, char **argv);
  33. #ifdef DETACH
  34. static void do_detach(long *alen, char **aptr);
  35. #endif
  36.  
  37. void
  38. _main(long alen, char *aptr)
  39. {
  40.     register struct Process *pp;
  41.  
  42. #ifdef DETACH
  43.     do_detach(&alen, &aptr);
  44. #endif
  45.  
  46.     if ((_devtab = AllocMem(_numdev*(long)sizeof(struct _dev),
  47.                                                     MEMF_CLEAR)) == 0) {
  48.         Alert(AG_NoMemory);
  49. #asm
  50.         move.l    __savsp,sp        ;get back original stack pointer
  51.         rts                        ;and exit
  52. #endasm
  53.     }
  54.  
  55.     _devtab[0].mode = O_RDONLY;
  56.     _devtab[1].mode = _devtab[2].mode = O_WRONLY;
  57.  
  58.     _stkbase = _savsp - *((long *)_savsp+1) + 8;
  59.     *(long *)_stkbase = 0x4d414e58L;
  60.  
  61.     pp = (struct Process *)FindTask(0L);
  62. #ifdef DETACH
  63.     if (alen) {
  64. #else
  65.     if (pp->pr_CLI) {
  66. #endif
  67.         _cli_parse(pp, alen, aptr);
  68.         Enable_Abort = 1;
  69. #ifndef DETACH
  70.         _devtab[0].mode |= O_STDIO;        /* shouldn't close if CLI */
  71.         _devtab[1].mode |= O_STDIO;
  72. #endif
  73.     }
  74.     else {
  75.         WaitPort(&pp->pr_MsgPort);
  76.         WBenchMsg = (struct WBStartup *)GetMsg(&pp->pr_MsgPort);
  77.         if (WBenchMsg->sm_ArgList) {
  78.             CurrentDir(WBenchMsg->sm_ArgList->wa_Lock);
  79.             _wb_parse(pp, WBenchMsg);
  80.         }
  81.         _argv = (char **)WBenchMsg;
  82.     }
  83.     _devtab[0].fd = Input();
  84.     _devtab[1].fd = Output();
  85.     if (pp->pr_ConsoleTask)
  86.         _devtab[2].fd = Open((UBYTE *)"*", (long)MODE_OLDFILE);
  87.     exit(main(_argc, _argv));
  88. }
  89.  
  90. #ifdef DETACH
  91. extern long _stack, _priority, _BackGroundIO;
  92. extern char *_procname;
  93. BPTR _Backstdout = 0;
  94. extern BPTR _detach_curdir;
  95. extern char *_detach_name;
  96. static long _alen = 0;
  97. static char *_aptr = 0;
  98.  
  99. static void
  100. do_detach(long *alen, char **aptr)
  101. {
  102.     register struct Process *pp;
  103.     register unsigned short c;
  104.     register char *cp;
  105.     register struct CommandLineInterface *cli;
  106.     register long l;
  107.     long *lp, *sav;
  108.     struct MemList *mm;
  109.     struct Library *savlib;
  110.  
  111.     pp = (struct Process *)FindTask(0L);
  112.     if (pp->pr_CLI) {            /* first time through!! */
  113.         CurrentDir(_detach_curdir = CurrentDir(0L));
  114.         _detach_curdir = DupLock(_detach_curdir);
  115.  
  116.         cli = (struct CommandLineInterface *) ((long)pp->pr_CLI << 2);
  117.         l = cli->cli_Module;
  118.         if ((savlib = OpenLibrary((UBYTE *)DOSNAME, 33L)) == 0) {
  119.  
  120.             lp = (long *)*((long *)*((long *)*((long *)*((long *)
  121.                                             _savsp+2)+1)-3)-3)+107;
  122.             if (*lp != cli->cli_Module)
  123.                 exit(100);
  124.         }
  125.         else {
  126.             CloseLibrary(savlib);
  127.             lp = 0;
  128.         }
  129.         if (lp)
  130.             *lp = 0;
  131.         if (_stack == 0)
  132.             _stack = cli->cli_DefaultStack * 4;
  133.         if (_BackGroundIO)
  134.             _Backstdout = (BPTR)Open((UBYTE *)"*", (long)MODE_OLDFILE);
  135.         _alen = *alen;
  136.         if ((_aptr = AllocMem(_alen, 0L)) == 0)
  137.             goto cleanup;
  138.         memmove(_aptr, *aptr, (size_t)_alen);
  139.         cp = (char *)((long)cli->cli_CommandName << 2);
  140.         if ((_detach_name = AllocMem((long)cp[0]+1, 0L)) == 0)
  141.             goto cleanup;
  142.         memmove(_detach_name, cp, (size_t)cp[0]+1);
  143. #asm
  144.         move.l    __savsp,-(sp)
  145. #endasm
  146.         if (CreateProc((UBYTE *)_procname, _priority, l, _stack)) {
  147.             cli->cli_Module = 0;
  148.             l = 0;
  149.         }
  150.         else {
  151. cleanup:
  152.             if (_aptr)
  153.                 FreeMem(_aptr, _alen);
  154.             if (_detach_name)
  155.                 FreeMem(_detach_name, (long)cp[0]+1);
  156.             l = 1001;
  157.         }
  158.         ;
  159. #asm
  160.         move.l    (sp)+,sp
  161.         move.l    %%l,d0
  162.         rts
  163. #endasm
  164.     }
  165.     else if (_alen) { /* second time */
  166.         lp = (long *)((long)pp->pr_SegList << 2);
  167.         lp = (long *)(lp[3] << 2);
  168.         sav = lp;
  169.         c = 2;
  170.         while (lp) {
  171.             lp = (long *)(*lp << 2);
  172.             c++;
  173.         }
  174.         mm = AllocMem((long)sizeof(struct MemList)+
  175.                             (c-1)*sizeof(struct MemEntry), 0L);
  176.         lp = sav;
  177.         mm->ml_NumEntries = c;
  178.         c = 0;
  179.         while (lp) {
  180.             mm->ml_me[c].me_Addr = (APTR)((unsigned long)lp - 1);
  181.             mm->ml_me[c].me_Length = lp[-1];
  182.             lp = (long *)(*lp << 2);
  183.             c++;
  184.         }
  185.         mm->ml_me[c].me_Addr = (APTR)_aptr;
  186.         mm->ml_me[c++].me_Length = _alen;
  187.         mm->ml_me[c].me_Addr = (APTR)_detach_name;
  188.         mm->ml_me[c++].me_Length = _detach_name[0] + 1;
  189.  
  190.         AddTail(&pp->pr_Task.tc_MemEntry, &mm->ml_Node);
  191.  
  192.         CurrentDir(_detach_curdir);
  193.  
  194.         pp->pr_COS = _Backstdout;
  195.  
  196.         *alen = _alen;
  197.         *aptr = _aptr;
  198.     }
  199. }
  200. #endif
  201.  
  202.